闲扯
这道题感觉很有价值,练习了 $AC$ 自动机上的 $DP$ 的同时,顺便加深一下对数位 $DP$ 的理解。
题面
Solution
看到不能包含某个子串,我们先套路的建出 $AC$ 自动机,顺便处理出那些节点是不能选取的(会构成非法子串)。
然后问题就有些讲究了。
因为题目要求我们得到的数不能大于 $n$ ,所以我们可以想到将数位 $DP$ 放在 $AC$ 自动机上来跑。
我们设 $dp_{i,j,0/1}$ 表示当前填到第 $i$ 位,且在第 $j$ 个节点上。
$0,1$ 分别表示不压位和压位。
我们有如下的转移方程:
分别表示:
上一位没有压位的情况下,这一位 $[0,9]$ 可以随便填。
上一位压位的情况下,为了不压位,只能填 $[0,t[i]-‘0’)$ 。
前 $i$ 位均压位,所以必须由前 $i-1$ 位都压位转移,且这一位只能填 $t[i]-‘0’$ 。
Code
1 |
|